﻿using System;
using System.Linq;
using System.Collections.Generic;
using System.Windows.Forms;
using PharmacyPharnet.Core;
using Pharmacy.Data.Entity;
using Pharmacy.ExceptionHandling;
using Pharmacy.Business;
using Pharmacy.Ultilities;
using Pharmacy.Data;
using Pharmacy.Data.Repositories;
using Pharmacy.Data.Core;
using Pharmacy.Business.Generator;
using Pharmacy.Ultilities.Resources;
using System.Xml;
using DevExpress.Utils;
using PharmacyPharnet.Core.Entity;
using System.Data.Objects.DataClasses;

namespace PharmacyPharnet.MasterData
{
    public partial class FrmMasterItem_Detail : FrmEditBase
    {
        #region Declarations
        MasterItem currentObject;
        IObjectContext pharmacyContext;
        MasterItemBO masterItemBO;
        UnitOfMeasureInfoCollection lstUOMInfo;
        UnitOfMeasureRepository rUnitOfMeasure;

        /// <summary>
        /// 0 : tên sản phẩm
        /// 2 : hoạt chất
        /// 3 : quốc gia
        /// 4 : nhà sản xuất
        /// </summary>
        string patternTenDayDu = "{0}_{1}_{2}_{3}_{4}";
        #endregion

        #region Constructors
        public FrmMasterItem_Detail()
        {
            InitializeComponent();
        }

        public FrmMasterItem_Detail(Enums.ActionForm actionForm)
            : this()
        {
            CurrentAction = actionForm;
        }

        public FrmMasterItem_Detail(MasterItem item, Enums.ActionForm actionForm, IObjectContext context)
            : this(actionForm)
        {
            currentObject = item;
            pharmacyContext = context;
        }
        #endregion

        #region Override Methods
        protected override void InitializeBO()
        {
            if (pharmacyContext == null)
                pharmacyContext = ObjectContextFactory.CreatePharmacyContext(Global.UserName, Global.CurrentConnectionString);
            if (masterItemBO == null)
                masterItemBO = new MasterItemBO(pharmacyContext);
        }

        protected override void PopulateData()
        {
            BindDataToControls();
        }

        protected override void PopulateStaticData()
        {
            txtMaSanPham.Text = IdentityGeneratorHelper.GetNextNumber(Enums.GeneratorObjectType.MasterItemGenerator, pharmacyContext.GetCurrentDateTime(), null, pharmacyContext);
            LoadDangBaoChe(0);
            LoadNhomDonViTinh(0);
            LoadDonViTinh();
            LoadNhaSanXuat(0);
            LoadQuocGia(0);
            LoadNhomSanPham(0);
            LoadNganh(0);
        }
        #endregion

        #region Custom Methods
        /// <summary>
        /// Đăng ký sự kiện cho các button thêm, xóa, sửa
        /// </summary>
        private void RegisterEventhandler()
        {
            btnNew.Click += new EventHandler(btnNew_Click);
            btnCancel.Click += new EventHandler(btnCancel_Click);
            btnDelete.Click += new EventHandler(btnDelete_Click);
            btnSave.Click += new EventHandler(btnSave_Click);
        }

        /// <summary>
        /// Xóa giá trị của các control chỉnh sửa
        /// </summary>
        private void ClearData()
        {
            txtMaSanPham.Text = IdentityGeneratorHelper.GetNextNumber(Enums.GeneratorObjectType.MasterItemGenerator, pharmacyContext.GetCurrentDateTime(), null, pharmacyContext);
            txtChiDinh.Text = string.Empty;
            txtChongChiDinh.Text = string.Empty;
            txtGhiChu.Text = string.Empty;
            txtHoatChat.Text = string.Empty;
            txtHuongDanSuDung.Text = string.Empty;
            txtTacDungPhu.Text = string.Empty;
            txtTenSanPham.Text = string.Empty;
            txtTenSanPhamDayDu.Text = string.Empty;
            lueDangBaoChe.EditValue = null;
            lueNhomDonViTinh.EditValue = null;
            lueNganh.EditValue = null;
            lueNhaSanXuat.EditValue = null;
            lueNhomSanPham.EditValue = null;
            lueQuocGia.EditValue = null;
            spnQtyMax.EditValue = 0;
            spnQtyMin.EditValue = 0;
            lstUOMInfo = null;
            trlItemUOMDetail = null;
            CurrentAction = Pharmacy.Ultilities.Enums.ActionForm.New;
        }

        /// <summary>
        /// Bind dữ liệu từ object vào controls
        /// </summary>
        private void BindDataToControls()
        {
            if (currentObject != null && CurrentAction == Pharmacy.Ultilities.Enums.ActionForm.Edit)
            {
                txtMaSanPham.Text = currentObject.ERPItemCode;
                txtChiDinh.Text = currentObject.Indication;
                txtChongChiDinh.Text = currentObject.Contraindications;
                txtGhiChu.Text = currentObject.Note;
                txtHoatChat.Text = currentObject.ActiveElement;
                txtHuongDanSuDung.Text = currentObject.Instruction;
                txtTacDungPhu.Text = currentObject.SideEffects;
                txtTenSanPham.Text = currentObject.Name;
                txtTenSanPhamDayDu.Text = currentObject.FullName;
                UnitOfMeasureGroup uomGroup = currentObject.Item_UOM.FirstOrDefault().UnitOfMeasureGroup;
                lueNhomDonViTinh.EditValue = uomGroup != null ? uomGroup.ID : 0;
                lueDangBaoChe.EditValue = currentObject.PharmaceuticalForm != null ? currentObject.PharmaceuticalForm.ID : 0;
                lueNhaSanXuat.EditValue = currentObject.Manufacturer != null ? currentObject.Manufacturer.ID : 0;
                lueNhomSanPham.EditValue = currentObject.MasterItemGroup != null ? currentObject.MasterItemGroup.ID : 0;
                lueQuocGia.EditValue = currentObject.Country != null ? currentObject.Country.ID : 0;
                lueNganh.EditValue = currentObject.Category != null ? currentObject.Category.ID : 0;
                spnQtyMax.EditValue = currentObject.MaxQtyInStock;
                spnQtyMin.EditValue = currentObject.MinQtyInStock;

                // Bind Data to Treeview
                lstUOMInfo = new UnitOfMeasureInfoCollection();
                UnitOfMeasureInfo uomInfo;
                foreach (Item_UOM item in currentObject.Item_UOM)
                {
                    UnitOfMeasure uom = item.UnitOfMeasure;
                    uomInfo = new UnitOfMeasureInfo(uom.ID, uom.Name, item.RatePrice.Value, item.SequenceNo.Value, item.ParentID.Value);
                    uomInfo.UnitCost = item.UnitCost.Value;
                    uomInfo.UnitPrice = item.UnitPrice.Value;
                    uomInfo.RateQty = item.RateQty.GetValueOrDefault();
                    lstUOMInfo.Add(uomInfo);
                }
                trlItemUOMDetail.DataSource = lstUOMInfo;

                CurrentAction = Pharmacy.Ultilities.Enums.ActionForm.Edit;
            }
        }

        /// <summary>
        /// Bind dữ liệu từ controls vào object.        
        /// </summary>
        private void BindDataToObject()
        {
            if (currentObject == null || CurrentAction == Enums.ActionForm.New)
            {
                currentObject = null;
                currentObject = new MasterItem();
            }
            currentObject.ERPItemCode = txtMaSanPham.Text.Trim();
            currentObject.Indication = txtChiDinh.Text.Trim();
            currentObject.Contraindications = txtChongChiDinh.Text.Trim();
            currentObject.Note = txtGhiChu.Text.Trim();
            currentObject.ActiveElement = txtHoatChat.Text.Trim();
            currentObject.Instruction = txtHuongDanSuDung.Text.Trim();
            currentObject.SideEffects = txtTacDungPhu.Text.Trim();
            currentObject.Name = txtTenSanPham.Text.Trim();
            currentObject.FullName = txtTenSanPhamDayDu.Text.Trim();
            currentObject.UnitOfMeasure = lueNhomDonViTinh.Properties.GetDataSourceRowByKeyValue(lueNhomDonViTinh.EditValue) as UnitOfMeasure;
            currentObject.PharmaceuticalForm = lueDangBaoChe.EditValue != null ?
                                                lueDangBaoChe.Properties.GetDataSourceRowByKeyValue(lueDangBaoChe.EditValue) as PharmaceuticalForm
                                                : null;
            currentObject.Manufacturer = lueNhaSanXuat.EditValue != null ?
                                            lueNhaSanXuat.Properties.GetDataSourceRowByKeyValue(lueNhaSanXuat.EditValue) as Manufacturer
                                            : null;
            currentObject.MasterItemGroup = lueNhomSanPham.EditValue != null ?
                                            lueNhomSanPham.Properties.GetDataSourceRowByKeyValue(lueNhomSanPham.EditValue) as MasterItemGroup
                                            : null;
            currentObject.Country = lueQuocGia.EditValue != null ?
                                    lueQuocGia.Properties.GetDataSourceRowByKeyValue(lueQuocGia.EditValue) as Country :
                                    null;
            currentObject.Category = lueNganh.EditValue != null ?
                                    lueNganh.Properties.GetDataSourceRowByKeyValue(lueNganh.EditValue) as Category :
                                    null;
            currentObject.MaxQtyInStock = Convert.ToDecimal(spnQtyMax.EditValue);
            currentObject.MinQtyInStock = Convert.ToDecimal(spnQtyMin.EditValue);

            if (CurrentAction == Enums.ActionForm.New)
            {
                // Tạo Item_UOM
                Item_UOM itemUOM;
                foreach (UnitOfMeasureInfo uomInfo in lstUOMInfo)
                {
                    itemUOM = new Item_UOM();
                    itemUOM.MasterItem = currentObject;
                    itemUOM.ParentID = uomInfo.ParentID;
                    itemUOM.SequenceNo = uomInfo.SequenceNo;
                    itemUOM.UnitCost = uomInfo.UnitCost;
                    itemUOM.UnitPrice = uomInfo.UnitPrice;
                    itemUOM.RateQty = uomInfo.RateQty;
                    itemUOM.RatePrice = uomInfo.RatePrice;
                    itemUOM.UnitOfMeasure = rUnitOfMeasure.AsQueryable().Where(uom => uom.ID == uomInfo.Id).FirstOrDefault();
                    itemUOM.UnitOfMeasureGroup = lueNhomDonViTinh.Properties.GetDataSourceRowByKeyValue(lueNhomDonViTinh.EditValue) as UnitOfMeasureGroup;

                    // Lưu UOM base vào item
                    if (itemUOM.SequenceNo == 1)
                        currentObject.UnitOfMeasure = itemUOM.UnitOfMeasure;
                }
            }
            else if (CurrentAction == Enums.ActionForm.Edit)
            {
                // Tạo Item_UOM
                Item_UOM itemUOM;
                EntityCollection<Item_UOM> lstItemUOM = currentObject.Item_UOM;
                foreach (UnitOfMeasureInfo uomInfo in lstUOMInfo)
                {
                    itemUOM = lstItemUOM.Where(uom => uom.UnitOfMeasure.ID == uomInfo.Id).FirstOrDefault();
                    if (itemUOM != null)
                    {
                        itemUOM.UnitCost = uomInfo.UnitCost;
                        itemUOM.UnitPrice = uomInfo.UnitPrice;
                        itemUOM.RateQty = uomInfo.RateQty;
                    }
                }
            }
        }

        /// <summary>
        /// Validaet dữ liệu trước khi save. 
        /// true: hợp lệ - false: có lỗi
        /// </summary>
        /// <returns></returns>
        private bool Validate()
        {
            bool isValid = true;
            if (txtTenSanPham.Text.Trim().Length <= 0)
            {
                txtTenSanPham.ErrorText = string.Format(SR.Instance.GetString(Constant.KEY_EMPTYINFORMATION), SR.Instance.GetString(Constant.ENT_MASTERITEMNAME));
                isValid = false;
            }
            if (lueNhomDonViTinh.EditValue == null || lueNhomDonViTinh.Text.Trim().Length <= 0)
            {
                lueNhomDonViTinh.ErrorText = string.Format(SR.Instance.GetString(Constant.KEY_EMPTYINFORMATION), SR.Instance.GetString(Constant.ENT_MANUFACTURERGROUP));
                isValid = false;
            }
            //Reload UOM
            else if (lueNhomDonViTinh.EditValue != null)
            {
                UnitOfMeasureGroupRepository rUOM = new UnitOfMeasureGroupRepository(pharmacyContext);
                int selectedUOMID = (lueNhomDonViTinh.Properties.GetDataSourceRowByKeyValue(lueNhomDonViTinh.EditValue) as UnitOfMeasureGroup).ID;
                UnitOfMeasureGroup objTemp = rUOM.AsQueryable().Where(m => m.ID == selectedUOMID).First();
                if (objTemp == null)
                {
                    lueNhomDonViTinh.ErrorText = string.Format(SR.Instance.GetString(Constant.KEY_OBJECTISDELETED), SR.Instance.GetString(Constant.ENT_UNITOFMEASURE));
                    isValid = false;
                }
            }
            if (lueNhomSanPham.EditValue == null || lueNhomSanPham.Text.Trim().Length <= 0)
            {
                lueNhomSanPham.ErrorText = string.Format(SR.Instance.GetString(Constant.KEY_EMPTYINFORMATION), SR.Instance.GetString(Constant.ENT_MASTERITEMGROUP));
                isValid = false;
            }
            //Reload Nhom San Pham
            else if (lueNhomSanPham.EditValue != null)
            {
                MasterItemGroupRepository rUOM = new MasterItemGroupRepository(pharmacyContext);
                int selectedMasterItemGroupID = (lueNhomSanPham.Properties.GetDataSourceRowByKeyValue(lueNhomSanPham.EditValue) as MasterItemGroup).ID;
                MasterItemGroup objTemp = rUOM.AsQueryable().Where(m => m.ID == selectedMasterItemGroupID).First();
                if (objTemp == null)
                {
                    lueNhomSanPham.ErrorText = string.Format(SR.Instance.GetString(Constant.KEY_OBJECTISDELETED), SR.Instance.GetString(Constant.ENT_MASTERITEMGROUP));
                    isValid = false;
                }
            }
            //Reload Dang Bao Che
            if (lueDangBaoChe.EditValue != null && lueDangBaoChe.Text != string.Empty)
            {
                PharmaceuticalFormRepository rPharmaceuticalForm = new PharmaceuticalFormRepository(pharmacyContext);
                int selectedPharmaceuticalFormID = (lueDangBaoChe.Properties.GetDataSourceRowByKeyValue(lueDangBaoChe.EditValue) as PharmaceuticalForm).ID;
                PharmaceuticalForm objTemp = rPharmaceuticalForm.AsQueryable().Where(m => m.ID == selectedPharmaceuticalFormID).First();
                if (objTemp == null)
                {
                    lueDangBaoChe.ErrorText = string.Format(SR.Instance.GetString(Constant.KEY_OBJECTISDELETED), SR.Instance.GetString(Constant.ENT_PHARMACEUTICALFORM));
                    isValid = false;
                }
            }
            //Reload Nha san xuat
            if (lueNhaSanXuat.EditValue != null && lueNhaSanXuat.Text != string.Empty)
            {
                ManufacturerRepository rManufacturer = new ManufacturerRepository(pharmacyContext);
                int selectedManufacturerID = (lueNhaSanXuat.Properties.GetDataSourceRowByKeyValue(lueNhaSanXuat.EditValue) as Manufacturer).ID;
                Manufacturer objTemp = rManufacturer.AsQueryable().Where(m => m.ID == selectedManufacturerID).First();
                if (objTemp == null)
                {
                    lueNhaSanXuat.ErrorText = string.Format(SR.Instance.GetString(Constant.KEY_OBJECTISDELETED), SR.Instance.GetString(Constant.ENT_MANUFACTURER));
                    isValid = false;
                }
            }
            //Reload Nha san xuat
            if (lueQuocGia.EditValue != null && lueQuocGia.Text != string.Empty)
            {
                CountryRepository rCountry = new CountryRepository(pharmacyContext);
                int selectedCountryID = (lueQuocGia.Properties.GetDataSourceRowByKeyValue(lueQuocGia.EditValue) as Country).ID;
                Country objTemp = rCountry.AsQueryable().Where(m => m.ID == selectedCountryID).First();
                if (objTemp == null)
                {
                    lueQuocGia.ErrorText = string.Format(SR.Instance.GetString(Constant.KEY_OBJECTISDELETED), SR.Instance.GetString(Constant.ENT_COUNTRY));
                    isValid = false;
                }
            }
            if (spnQtyMax.Text.Length > 0 && spnQtyMin.Text.Length > 0 && Convert.ToDecimal(spnQtyMax.EditValue) < Convert.ToDecimal(spnQtyMin.EditValue))
            {
                spnQtyMax.ErrorText = string.Format(SR.Instance.GetString(Constant.KEY_GREATERTHAN), SR.Instance.GetString(Constant.KEY_MASTERITEMMAXQTYINSTOCK), SR.Instance.GetString(Constant.KEY_MASTERITEMMINQTYINSTOCK));
                isValid = false;
            }
            return isValid;
        }

        /// <summary>
        /// Load nhóm đơn vị và bind vào lokkupedit
        /// </summary>
        /// <param name="selectedID"></param>
        private void LoadNhomDonViTinh(int selectedID)
        {
            UnitOfMeasureGroupRepository rUOM = new UnitOfMeasureGroupRepository(pharmacyContext, MergeOption.Overrive);
            List<UnitOfMeasureGroup> lstUOM = rUOM.AsQueryable().ToList();
            lueNhomDonViTinh.Properties.DataSource = lstUOM;
            lueNhomDonViTinh.Properties.DropDownRows = lstUOM.Count;
            if (selectedID > 0)
                lueNhomDonViTinh.EditValue = selectedID;
        }

        /// <summary>
        /// Load danh sách các đơn vị tính
        /// </summary>
        private void LoadDonViTinh()
        {
            rUnitOfMeasure = new UnitOfMeasureRepository(pharmacyContext, MergeOption.Overrive);
        }

        private void LoadNhaSanXuat(int selectedID)
        {
            ManufacturerRepository rManufacturer = new ManufacturerRepository(pharmacyContext, MergeOption.Overrive);
            List<Manufacturer> lstManufacturer = rManufacturer.AsQueryable().ToList();
            lueNhaSanXuat.Properties.DataSource = lstManufacturer;
            lueNhaSanXuat.Properties.DropDownRows = lstManufacturer.Count;
            if (selectedID > 0)
                lueNhaSanXuat.EditValue = selectedID;
        }

        private void LoadQuocGia(int selectedID)
        {
            CountryRepository rCountry = new CountryRepository(pharmacyContext, MergeOption.Overrive);
            List<Country> lstCountry = rCountry.AsQueryable().ToList();
            lueQuocGia.Properties.DataSource = lstCountry;
            lueQuocGia.Properties.DropDownRows = lstCountry.Count;
            if (selectedID > 0)
                lueQuocGia.EditValue = selectedID;
        }

        private void LoadNganh(int selectedID)
        {
            CategoryRepository rCategory = new CategoryRepository(pharmacyContext, MergeOption.Overrive);
            List<Category> lstCategory = rCategory.AsQueryable().ToList();
            lueNganh.Properties.DataSource = lstCategory;
            lueNganh.Properties.DropDownRows = lstCategory.Count;
            if (selectedID > 0)
                lueNganh.EditValue = selectedID;
        }

        private void LoadDangBaoChe(int selectedID)
        {
            PharmaceuticalFormRepository rPharmaceuticalForm = new PharmaceuticalFormRepository(pharmacyContext, MergeOption.Overrive);
            List<PharmaceuticalForm> lstPharmaceuticalForm = rPharmaceuticalForm.AsQueryable().ToList();
            lueDangBaoChe.Properties.DataSource = lstPharmaceuticalForm;
            lueDangBaoChe.Properties.DropDownRows = lstPharmaceuticalForm.Count;
            if (selectedID > 0)
                lueDangBaoChe.EditValue = selectedID;
        }

        private void LoadNhomSanPham(int selectedID)
        {
            MasterItemGroupRepository rMasterItemGroup = new MasterItemGroupRepository(pharmacyContext, MergeOption.Overrive);
            List<MasterItemGroup> lstMasterItemGroup = rMasterItemGroup.AsQueryable().ToList();
            lueNhomSanPham.Properties.DataSource = lstMasterItemGroup;
            lueNhomSanPham.Properties.DropDownRows = lstMasterItemGroup.Count;
            if (selectedID > 0)
                lueNhomSanPham.EditValue = selectedID;
        }

        private void FormatTenDayDuSanPham()
        {
            string tendaydu = string.Empty;
            if (txtTenSanPham.Text.Length > 0)
                tendaydu = txtTenSanPham.Text.Trim();
            if (txtHoatChat.Text.Length > 0)
                tendaydu += string.Format("_{0}", txtHoatChat.Text.Trim());
            if (lueQuocGia.Text.Length > 0)
                tendaydu += string.Format("_{0}", lueQuocGia.Text.Trim());
            if (lueNhaSanXuat.Text.Length > 0)
                tendaydu += string.Format("_{0}", lueNhaSanXuat.Text.Trim());
            txtTenSanPhamDayDu.Text = tendaydu;
        }

        private void BindUOMGroupToTreeList()
        {
            UnitOfMeasureGroup uomGroup = lueNhomDonViTinh.Properties.GetDataSourceRowByKeyValue(lueNhomDonViTinh.EditValue) as UnitOfMeasureGroup;
            if (uomGroup != null && CurrentAction != Enums.ActionForm.Edit)
            {
                lstUOMInfo = new UnitOfMeasureInfoCollection();
                UnitOfMeasureInfo uomInfo;
                UnitOfMeasureGroupDetail uomGroupDetail;
                UnitOfMeasure uom;
                List<UnitOfMeasureGroupDetail> lstUOMGroupDetails = uomGroup.UnitOfMeasureGroupDetails.ToList();
                for (int i = 0; i < lstUOMGroupDetails.Count; i++)
                {
                    uomGroupDetail = lstUOMGroupDetails[i];
                    uom = uomGroupDetail.UnitOfMeasure;
                    uomInfo = new UnitOfMeasureInfo(uom.ID, uom.Name, uomGroupDetail.RatePrice.Value, uomGroupDetail.SequenceNo.Value, uomGroupDetail.ParentID.Value);
                    lstUOMInfo.Add(uomInfo);
                }
                trlItemUOMDetail.DataSource = lstUOMInfo;
            }
        }

        /// <summary>
        /// Tính lại giá bán khi chỉnh sửa giá bán ở đơn vị tính cơ bản
        /// </summary>
        private void CalculateUnitPrice(UnitOfMeasureInfo uomInfo)
        {
            if (uomInfo.SequenceNo == 1) // đang chỉnh sửa giá bán của đơn vị tính cơ bản
            {
                UnitOfMeasureInfo uomCurrentInfo;
                UnitOfMeasureInfo uomChildInfo = uomInfo; // Default là đơn vị tính cơ bản
                // Duyêt các đơn vị tính còn lại từ dưới lên, trừ đơn vị tính cơ bản
                for (int i = lstUOMInfo.Count - 2; i >= 0; i--)
                {
                    uomCurrentInfo = lstUOMInfo[i];
                    uomCurrentInfo.UnitPrice = uomChildInfo.UnitPrice * uomCurrentInfo.RateQty * uomCurrentInfo.RatePrice;
                    uomChildInfo = uomCurrentInfo;
                }
            }
        }

        /// <summary>
        /// Validate giá bán của sản phẩm khi chỉnh sửa bằng tay co các đơn vị tính không phải là cơ bản
        /// </summary>
        /// <param name="uomInfo"></param>
        /// <returns></returns>
        private string ValidateUnitPrice(UnitOfMeasureInfo uomInfo)
        {
            string errorMsg = string.Empty;
            if (uomInfo.UnitPrice < uomInfo.UnitCost)
            {
                errorMsg = "Giá bán không thể nhỏ hơn giá mua.";
                return errorMsg;
            }
            if (uomInfo.SequenceNo > 1)
            {
                int sequenceNo = uomInfo.SequenceNo;
                UnitOfMeasureInfo uomParentInfo = LinqToObject.From<UnitOfMeasureInfo>(lstUOMInfo)
                                                                .Where(obj => obj.SequenceNo == (sequenceNo + 1))
                                                                .FirstOrDefault();
                UnitOfMeasureInfo uomChildInfo = LinqToObject.From<UnitOfMeasureInfo>(lstUOMInfo)
                                                                .Where(obj => obj.SequenceNo == (sequenceNo - 1))
                                                                .FirstOrDefault();
                if (uomParentInfo != null && uomInfo.UnitPrice > uomParentInfo.UnitPrice)
                {
                    errorMsg = string.Format("Giá bán của {0} không thể lớn hơn giá bán của {1}.\r\n", uomInfo.Name, uomParentInfo.Name);
                }
                if (uomChildInfo != null && uomInfo.UnitPrice < uomChildInfo.UnitPrice)
                {
                    errorMsg += string.Format("Giá bán của {0} không thể nhỏ hơn giá bán của {1}.", uomInfo.Name, uomChildInfo.Name);
                }
            }
            return errorMsg;
        }

        private string ValidateUnitCost(UnitOfMeasureInfo uomInfo)
        {
            string errorMsg = string.Empty;
            if (uomInfo.UnitCost > uomInfo.UnitPrice)
            {
                errorMsg = "Giá mua không lớn hơn giá bán.";
                return errorMsg;
            }
            return errorMsg;
        }
        #endregion

        #region Event Handlers
        private void FrmMasterItem_Detail_Load(object sender, EventArgs e)
        {
            try
            {
                RegisterEventhandler();
            }
            catch (Exception ex)
            {
                MessageBox.Show("Có lỗi xảy ra. Vui lòng liên hệ Người quản trị hệ thống để được hỗ trợ.");
                ExceptionHandler.LogWriter.Write(ex, ExceptionHandler.LOG_CAT_GENERAL);
                this.Close();
            }
        }

        void btnSave_Click(object sender, EventArgs e)
        {
            try
            {
                bool result = true;
                string message = string.Empty;
                if (Validate() && trlItemUOMDetail.HasColumnErrors == false)
                {
                    ViewManager.CreateWaitDialog();
                    ViewManager.SetWaitDialogCaption(SR.Instance.GetString(Constant.ENT_MASTERITEM), "Saving...");
                    string errorMessage = string.Empty;
                    BindDataToObject();
                    if (CurrentAction == Enums.ActionForm.New)
                    {
                        masterItemBO.CreateNewMasterItem(currentObject);
                        ClearData();
                    }
                    if (CurrentAction == Enums.ActionForm.Edit)
                    {
                        result = masterItemBO.EditMasterItem(currentObject, out message);
                        if (result == false)
                        {
                            MessageBox.Show(message);
                            return;
                        }
                    }
                }

            }
            catch (PessimisticLockingException ex)
            {
                LockingInfo lockInfo = ex.LockDataInfo.ToList()[0];
                MessageBox.Show(string.Format(SR.Instance.GetString(Constant.MSG_LOCKBYANOTHERUSER)
                                                , SR.Instance.GetString(Constant.ENT_MASTERITEM)
                                                , currentObject.ERPItemCode
                                                , lockInfo.UserName, lockInfo.ComputerName));
                ExceptionHandler.LogWriter.Write(ex, ExceptionHandler.LOG_CAT_GENERAL);
            }
            catch (Exception ex)
            {
                MessageBox.Show("Có lỗi xảy ra. Vui lòng liên hệ Người quản trị hệ thống để được hỗ trợ.");
                ExceptionHandler.LogWriter.Write(ex, ExceptionHandler.LOG_CAT_GENERAL);
                this.Close();
            }
            finally
            {
                ViewManager.CloseWaitDialog();
            }
        }

        void btnDelete_Click(object sender, EventArgs e)
        {
            try
            {
                bool result = true;
                string message = string.Empty;
                if (currentObject != null && CurrentAction == Enums.ActionForm.Edit)
                {
                    ViewManager.CreateWaitDialog();
                    ViewManager.SetWaitDialogCaption(SR.Instance.GetString(Constant.ENT_MASTERITEM), "Deleting...");
                    result = masterItemBO.DeleteMasterItem(currentObject.ID, out message);
                    if (result == false)
                    {
                        MessageBox.Show(message);
                        return;
                    }
                    ClearData();
                }
            }
            catch (PessimisticLockingException ex)
            {
                LockingInfo lockInfo = ex.LockDataInfo.ToList()[0];
                MessageBox.Show(string.Format(SR.Instance.GetString(Constant.MSG_LOCKBYANOTHERUSER)
                                                , SR.Instance.GetString(Constant.ENT_MASTERITEM)
                                                , currentObject.ERPItemCode
                                                , lockInfo.UserName, lockInfo.ComputerName));
                ExceptionHandler.LogWriter.Write(ex, ExceptionHandler.LOG_CAT_GENERAL);
            }
            catch (Exception ex)
            {
                MessageBox.Show("Có lỗi xảy ra. Vui lòng liên hệ Người quản trị hệ thống để được hỗ trợ.");
                ExceptionHandler.LogWriter.Write(ex, ExceptionHandler.LOG_CAT_GENERAL);
                this.Close();
            }
            finally
            {
                ViewManager.CloseWaitDialog();
            }
        }

        void btnCancel_Click(object sender, EventArgs e)
        {
            try
            {
                if (CurrentAction == Pharmacy.Ultilities.Enums.ActionForm.New)
                    ClearData();
                if (CurrentAction == Pharmacy.Ultilities.Enums.ActionForm.Edit)
                    BindDataToControls();
            }
            catch (Exception ex)
            {
                MessageBox.Show("Có lỗi xảy ra. Vui lòng liên hệ Người quản trị hệ thống để được hỗ trợ.");
                ExceptionHandler.LogWriter.Write(ex, ExceptionHandler.LOG_CAT_GENERAL);
                this.Close();
            }
        }

        void btnNew_Click(object sender, EventArgs e)
        {
            try
            {
                ClearData();
            }
            catch (Exception ex)
            {
                MessageBox.Show("Có lỗi xảy ra. Vui lòng liên hệ Người quản trị hệ thống để được hỗ trợ.");
                ExceptionHandler.LogWriter.Write(ex, ExceptionHandler.LOG_CAT_GENERAL);
                this.Close();
            }
        }

        private void btnGenerateAutoMaSanPham_Click(object sender, EventArgs e)
        {
            txtMaSanPham.Text = IdentityGeneratorHelper.GetNextNumber(Enums.GeneratorObjectType.MasterItemGenerator, pharmacyContext.GetCurrentDateTime(), null, pharmacyContext);
        }

        private void txtTenSanPham_EditValueChanged(object sender, EventArgs e)
        {
            try
            {
                FormatTenDayDuSanPham();
            }
            catch (Exception ex)
            {
                MessageBox.Show("Có lỗi xảy ra. Vui lòng liên hệ Người quản trị hệ thống để được hỗ trợ.");
                ExceptionHandler.LogWriter.Write(ex, ExceptionHandler.LOG_CAT_GENERAL);
                this.Close();
            }
        }

        private void lueDangBaoChe_EditValueChanged(object sender, EventArgs e)
        {
            try
            {
                FormatTenDayDuSanPham();
            }
            catch (Exception ex)
            {
                MessageBox.Show("Có lỗi xảy ra. Vui lòng liên hệ Người quản trị hệ thống để được hỗ trợ.");
                ExceptionHandler.LogWriter.Write(ex, ExceptionHandler.LOG_CAT_GENERAL);
                this.Close();
            }
        }

        private void lueQuocGia_EditValueChanged(object sender, EventArgs e)
        {
            try
            {
                FormatTenDayDuSanPham();
            }
            catch (Exception ex)
            {
                MessageBox.Show("Có lỗi xảy ra. Vui lòng liên hệ Người quản trị hệ thống để được hỗ trợ.");
                ExceptionHandler.LogWriter.Write(ex, ExceptionHandler.LOG_CAT_GENERAL);
                this.Close();
            }
        }

        private void lueNhaSanXuat_EditValueChanged(object sender, EventArgs e)
        {
            try
            {
                FormatTenDayDuSanPham();
            }
            catch (Exception ex)
            {
                MessageBox.Show("Có lỗi xảy ra. Vui lòng liên hệ Người quản trị hệ thống để được hỗ trợ.");
                ExceptionHandler.LogWriter.Write(ex, ExceptionHandler.LOG_CAT_GENERAL);
                this.Close();
            }
        }

        private void lueNhomSanPham_ButtonPressed(object sender, DevExpress.XtraEditors.Controls.ButtonPressedEventArgs e)
        {
            try
            {
                if (e.Button.Kind == DevExpress.XtraEditors.Controls.ButtonPredefines.Ellipsis)
                {
                    FrmListMasterItemGroup frmtMasterItemGroup = new FrmListMasterItemGroup();
                    frmtMasterItemGroup.ucMasterData.RowSelected += frmtMasterItemGroup_RowSelected;
                    frmtMasterItemGroup.Show();
                }
            }
            catch (Exception ex)
            {
                MessageBox.Show("Có lỗi xảy ra. Vui lòng liên hệ Người quản trị hệ thống để được hỗ trợ.");
                ExceptionHandler.LogWriter.Write(ex, ExceptionHandler.LOG_CAT_GENERAL);
                this.Close();
            }
        }

        void frmtMasterItemGroup_RowSelected(object sender, Pharmacy.Ultilities.BaseEventArgs.RowSelectedArgs e)
        {
            try
            {
                int id = e.CurrentSelectedRowID;
                if (id > 0)
                {
                    LoadNhomSanPham(id);
                }
            }
            catch (Exception ex)
            {
                MessageBox.Show("Có lỗi xảy ra. Vui lòng liên hệ Người quản trị hệ thống để được hỗ trợ.");
                ExceptionHandler.LogWriter.Write(ex, ExceptionHandler.LOG_CAT_GENERAL);
                this.Close();
            }
        }

        private void lueDangBaoChe_ButtonPressed(object sender, DevExpress.XtraEditors.Controls.ButtonPressedEventArgs e)
        {
            try
            {
                if (e.Button.Kind == DevExpress.XtraEditors.Controls.ButtonPredefines.Ellipsis)
                {
                    FrmListPharmaceuticalForm frmPharmaceuticalForm = new FrmListPharmaceuticalForm();
                    frmPharmaceuticalForm.ucMasterData.RowSelected += frmPharmaceuticalForm_RowSelected;
                    frmPharmaceuticalForm.Show();
                }
            }
            catch (Exception ex)
            {
                MessageBox.Show("Có lỗi xảy ra. Vui lòng liên hệ Người quản trị hệ thống để được hỗ trợ.");
                ExceptionHandler.LogWriter.Write(ex, ExceptionHandler.LOG_CAT_GENERAL);
                this.Close();
            }
        }

        void frmPharmaceuticalForm_RowSelected(object sender, Pharmacy.Ultilities.BaseEventArgs.RowSelectedArgs e)
        {
            try
            {
                int id = e.CurrentSelectedRowID;
                if (id > 0)
                {
                    LoadDangBaoChe(id);
                }
            }
            catch (Exception ex)
            {
                MessageBox.Show("Có lỗi xảy ra. Vui lòng liên hệ Người quản trị hệ thống để được hỗ trợ.");
                ExceptionHandler.LogWriter.Write(ex, ExceptionHandler.LOG_CAT_GENERAL);
                this.Close();
            }
        }

        private void lueDonViTinh_ButtonPressed(object sender, DevExpress.XtraEditors.Controls.ButtonPressedEventArgs e)
        {
            try
            {
                if (e.Button.Kind == DevExpress.XtraEditors.Controls.ButtonPredefines.Ellipsis)
                {
                    FrmUnitOfMeasureGroup frmUnitOfMeasure = new FrmUnitOfMeasureGroup();
                    frmUnitOfMeasure.RowSelected += frmUnitOfMeasure_RowSelected;
                    frmUnitOfMeasure.Show();
                }
            }
            catch (Exception ex)
            {
                MessageBox.Show("Có lỗi xảy ra. Vui lòng liên hệ Người quản trị hệ thống để được hỗ trợ.");
                ExceptionHandler.LogWriter.Write(ex, ExceptionHandler.LOG_CAT_GENERAL);
                this.Close();
            }
        }

        void frmUnitOfMeasure_RowSelected(object sender, Pharmacy.Ultilities.BaseEventArgs.RowSelectedArgs e)
        {
            try
            {
                int id = e.CurrentSelectedRowID;
                if (id > 0)
                {
                    LoadNhomDonViTinh(id);
                }
            }
            catch (Exception ex)
            {
                MessageBox.Show("Có lỗi xảy ra. Vui lòng liên hệ Người quản trị hệ thống để được hỗ trợ.");
                ExceptionHandler.LogWriter.Write(ex, ExceptionHandler.LOG_CAT_GENERAL);
                this.Close();
            }
        }

        private void lueNhaSanXuat_ButtonPressed(object sender, DevExpress.XtraEditors.Controls.ButtonPressedEventArgs e)
        {
            try
            {
                if (e.Button.Kind == DevExpress.XtraEditors.Controls.ButtonPredefines.Ellipsis)
                {
                    FrmManufacturer_List frmNhaSanXuat = new FrmManufacturer_List();
                    frmNhaSanXuat.RowSelected += new FrmListBase.RowSelectedEventHandler(frmNhaSanXuat_RowSelected);
                    frmNhaSanXuat.Show();
                }
            }
            catch (Exception ex)
            {
                MessageBox.Show("Có lỗi xảy ra. Vui lòng liên hệ Người quản trị hệ thống để được hỗ trợ.");
                ExceptionHandler.LogWriter.Write(ex, ExceptionHandler.LOG_CAT_GENERAL);
                this.Close();
            }
        }

        void frmNhaSanXuat_RowSelected(object sender, Pharmacy.Ultilities.BaseEventArgs.RowSelectedArgs e)
        {
            try
            {
                int id = e.CurrentSelectedRowID;
                if (id > 0)
                {
                    LoadNhaSanXuat(id);
                }
            }
            catch (Exception ex)
            {
                MessageBox.Show("Có lỗi xảy ra. Vui lòng liên hệ Người quản trị hệ thống để được hỗ trợ.");
                ExceptionHandler.LogWriter.Write(ex, ExceptionHandler.LOG_CAT_GENERAL);
                this.Close();
            }
        }

        private void lueQuocGia_ButtonPressed(object sender, DevExpress.XtraEditors.Controls.ButtonPressedEventArgs e)
        {
            try
            {
                if (e.Button.Kind == DevExpress.XtraEditors.Controls.ButtonPredefines.Ellipsis)
                {
                    FrmListCountry frmtCountry = new FrmListCountry();
                    frmtCountry.ucMasterData.RowSelected += frmListCountry_RowSelected;
                    frmtCountry.Show();
                }
            }
            catch (Exception ex)
            {
                MessageBox.Show("Có lỗi xảy ra. Vui lòng liên hệ Người quản trị hệ thống để được hỗ trợ.");
                ExceptionHandler.LogWriter.Write(ex, ExceptionHandler.LOG_CAT_GENERAL);
                this.Close();
            }
        }

        void frmListCountry_RowSelected(object sender, Pharmacy.Ultilities.BaseEventArgs.RowSelectedArgs e)
        {
            try
            {
                int id = e.CurrentSelectedRowID;
                if (id > 0)
                {
                    LoadQuocGia(id);
                }
            }
            catch (Exception ex)
            {
                MessageBox.Show("Có lỗi xảy ra. Vui lòng liên hệ Người quản trị hệ thống để được hỗ trợ.");
                ExceptionHandler.LogWriter.Write(ex, ExceptionHandler.LOG_CAT_GENERAL);
                this.Close();
            }
        }

        private void lueNganh_ButtonPressed(object sender, DevExpress.XtraEditors.Controls.ButtonPressedEventArgs e)
        {
            try
            {
                if (e.Button.Kind == DevExpress.XtraEditors.Controls.ButtonPredefines.Ellipsis)
                {
                    FrmListCategory frmCategory = new FrmListCategory();
                    frmCategory.ucMasterData.RowSelected += new UserControls.UCMasterData<Category>.RowSelectedEventHandler(ucMasterData_RowSelected);
                    frmCategory.Show();
                }
            }
            catch (Exception ex)
            {
                MessageBox.Show("Có lỗi xảy ra. Vui lòng liên hệ Người quản trị hệ thống để được hỗ trợ.");
                ExceptionHandler.LogWriter.Write(ex, ExceptionHandler.LOG_CAT_GENERAL);
                this.Close();
            }
        }

        void ucMasterData_RowSelected(object sender, Pharmacy.Ultilities.BaseEventArgs.RowSelectedArgs e)
        {
            try
            {
                int id = e.CurrentSelectedRowID;
                if (id > 0)
                {
                    LoadNganh(id);
                }
            }
            catch (Exception ex)
            {
                MessageBox.Show("Có lỗi xảy ra. Vui lòng liên hệ Người quản trị hệ thống để được hỗ trợ.");
                ExceptionHandler.LogWriter.Write(ex, ExceptionHandler.LOG_CAT_GENERAL);
                this.Close();
            }
        }

        private void lueNhomDonViTinh_EditValueChanged(object sender, EventArgs e)
        {
            try
            {
                BindUOMGroupToTreeList();
            }
            catch (Exception ex)
            {
                MessageBox.Show("Có lỗi xảy ra. Vui lòng liên hệ Người quản trị hệ thống để được hỗ trợ.");
                ExceptionHandler.LogWriter.Write(ex, ExceptionHandler.LOG_CAT_GENERAL);
                this.Close();
            }
        }

        private void trlItemUOMDetail_CellValueChanged(object sender, DevExpress.XtraTreeList.CellValueChangedEventArgs e)
        {
            try
            {
                trlItemUOMDetail.ClearColumnErrors();
                UnitOfMeasureInfo uomInfo = trlItemUOMDetail.GetDataRecordByNode(e.Node) as UnitOfMeasureInfo;
                if (uomInfo != null && e.Column.FieldName == colUnitPrice.FieldName)
                {
                    string error = ValidateUnitPrice(uomInfo);
                    if (error.Length > 0)
                    {
                        trlItemUOMDetail.SetColumnError(colUnitPrice, error);
                        return;
                    }
                    CalculateUnitPrice(uomInfo);
                    trlItemUOMDetail.RefreshDataSource();
                }
                //else if (uomInfo != null && e.Column.FieldName == colUnitCost.FieldName)
                //{
                //    string error = ValidateUnitCost(uomInfo);
                //    if (error.Length > 0)
                //    {
                //        trlItemUOMDetail.SetColumnError(colUnitCost, error);
                //        return;
                //    }
                //}
            }
            catch (Exception ex)
            {
                MessageBox.Show("Có lỗi xảy ra. Vui lòng liên hệ Người quản trị hệ thống để được hỗ trợ.");
                ExceptionHandler.LogWriter.Write(ex, ExceptionHandler.LOG_CAT_GENERAL);
                this.Close();
            }
        }

        private void trlItemUOMDetail_InvalidNodeException(object sender, DevExpress.XtraTreeList.InvalidNodeExceptionEventArgs e)
        {
            e.ExceptionMode = DevExpress.XtraEditors.Controls.ExceptionMode.NoAction;
        }

        private void trlItemUOMDetail_ValidateNode(object sender, DevExpress.XtraTreeList.ValidateNodeEventArgs e)
        {
            try
            {
                trlItemUOMDetail.ClearColumnErrors();
                UnitOfMeasureInfo uomInfo = trlItemUOMDetail.GetDataRecordByNode(e.Node) as UnitOfMeasureInfo;
                if (uomInfo != null)
                {
                    string error = ValidateUnitPrice(uomInfo);
                    if (error.Length > 0)
                    {
                        e.ErrorText = error;
                        e.Valid = false;
                        trlItemUOMDetail.SetColumnError(colUnitPrice, error);
                        //return;
                    }
                    error = ValidateUnitCost(uomInfo);
                    if (error.Length > 0)
                    {
                        e.ErrorText = error;
                        e.Valid = false;
                        trlItemUOMDetail.SetColumnError(colUnitCost, error);
                        //return;
                    }

                }
            }
            catch (Exception ex)
            {
                MessageBox.Show("Có lỗi xảy ra. Vui lòng liên hệ Người quản trị hệ thống để được hỗ trợ.");
                ExceptionHandler.LogWriter.Write(ex, ExceptionHandler.LOG_CAT_GENERAL);
                this.Close();
            }
        }
        #endregion
    }
}